package Session;

import Levels.LevelGenerator;
import Questions.Question;

/**
 * Created with IntelliJ IDEA.
 * Authorization.User: Инесса
 * Date: 25.10.13
 * Time: 1:03
 * To change this template use File | Settings | File Templates.
 */

/**
 * Этот класс выполняет функции истории для пользователя. Хранит вопросы, ответы и номер текущего вопроса.
 */
public class TestSession {

    private Question[] arrayQuestions;
    private String[] arrayAnswers;
    private int currentIndexOfLevel;
    private int[] levelArray;
    private LevelGenerator levelGenerator;
    private int currentLevel;
    public static final int COUNT_OF_LEVELS=3;
    private int sessionPoints;
    private boolean isEnd=false;

    /**
     * Конструктор для создания сессии принимает массив всех вопросов и создает сессию.
     * @param questions пачка вопросов
     */
    public TestSession(Question[] questions) {
        this.arrayQuestions = questions;
        this.levelGenerator = new LevelGenerator();
        this.levelArray = levelGenerator.getLevel(LevelGenerator.LEVEL_ONE);
        this.arrayAnswers = new String[levelArray.length];
        this.currentLevel=LevelGenerator.LEVEL_ONE;
        this.sessionPoints=0;
    }

    public TestSession(Question[] questions,int[] levelArray, int pausedLevel, int savedPoints, String[] savedAnswers){
        this.arrayQuestions = questions;
        this.arrayAnswers = savedAnswers;
        this.levelGenerator = new LevelGenerator();
        this.levelArray=levelArray;
        this.currentLevel=pausedLevel;
        this.sessionPoints = savedPoints;
        this.currentIndexOfLevel = findPosition(savedAnswers);
    }

    /**
     * Проверка на наличиие следующего елемента в массиве вопросов.
     * @return пройден ли уровень?
     */
    public boolean hasNextInLevel() {
        return (currentIndexOfLevel < levelArray.length);
    }

    /**
     * Переход к следующему номеру вопроса
     */
    public void nextQuestion() {
        currentIndexOfLevel++;
    }

    /**
     * Предыдущий номер вопроса
     */
    public void previousQuestion() {
        currentIndexOfLevel--;
    }

    /**
     *
     * @return текущий вопрос
     */
    public Question getQuestion() {
        return arrayQuestions[levelArray[currentIndexOfLevel]];
    }

    /**
     * Записиваем ответ пользователя в массив ответов
     * @param answer ответ пользователя
     */
    public void setAnswer(String answer) {
        arrayAnswers[currentIndexOfLevel] = answer;
    }

    /**
     * Подсчет правильных ответов для сессии
     * @return результат уровня
     */
    public int countCorrect() {
        int rightAnswer = 0;
        for (int i = 0; i < levelArray.length; i++) {
            if (arrayQuestions[levelArray[i]].isCorrect(arrayAnswers[i])) {
                rightAnswer++;
            }
        }
        return rightAnswer;
    }

    /**
     * Возвращает количество вопросов сессии
     * @return сколько задали всего вопросов
     */
    public int totalQuestions() {
        return levelArray.length*COUNT_OF_LEVELS;
    }

    /**
     * Выбрать текущий вопрос
     * @param currentIndexOfLevel текущий индекс уровня
     */
    public void setCurrentIndexOfLevel(int currentIndexOfLevel) {
        this.currentIndexOfLevel = currentIndexOfLevel;
    }

    public void flushAnswers(){
        arrayAnswers = new String[arrayQuestions.length];
    }




    /**
     * Возвращает вопросы для сохранения сессии.
     * @return
     */
    Question[] getQuestions() {
        return arrayQuestions;
    }

    /**
     * Возвращает ответы для хранения сессии
     * @return
     */
    String[] getAnswers() {
        return arrayAnswers;
    }

    /**
     * Метод для присвоения ответов из предыдущей сессии
     * @param answers
     */
    void setAnswers(String[] answers) {
        this.arrayAnswers = answers;
    }

    public void levelUp() {
        switch (currentLevel){
            case LevelGenerator.LEVEL_ONE:
            currentLevel=LevelGenerator.LEVEL_TWO;
            levelArray=levelGenerator.getLevel(LevelGenerator.LEVEL_TWO);
            break;
            case LevelGenerator.LEVEL_TWO:
            currentLevel=LevelGenerator.LEVEL_THREE;
            levelArray=levelGenerator.getLevel(LevelGenerator.LEVEL_THREE);
            break;
            case LevelGenerator.LEVEL_THREE:
                setEnd(true);
            break;
        }
    }

    public void refreshLevel() {
        levelArray=levelGenerator.getLevel(currentLevel);
    }

    public boolean isEnd() {
        return isEnd;
    }

    public void setEnd(boolean end) {
        isEnd = end;
    }

    public void addSessionPoints(int sessionPoints) {
        this.sessionPoints += sessionPoints;
    }

    public int getSessionPoints() {
        return sessionPoints;
    }

    public int[] getLevelArray() {
        return levelArray;
    }

    public int getCurrentLevel() {
        return currentLevel;
    }

    private int findPosition(String[] answersFromFile){
        int findedPosition=0;
        for (int position=0;position<answersFromFile.length;position++){
            if(answersFromFile[position]==null)
            {findedPosition=position;}
        }
        return findedPosition;
    }
}
